home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / dlink / sym.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-09  |  2.1 KB  |  106 lines

  1. /*
  2.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  3.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  4.  *    DICE-LICENSE.TXT.
  5.  */
  6.  
  7. /*
  8.  *  SYM.C
  9.  *
  10.  *  Symbol Handling
  11.  */
  12.  
  13. #include "defs.h"
  14.  
  15. Prototype int    hash(char *, short);
  16. Prototype Sym    *FindSymbol(void *, short);
  17. Prototype Sym    *CreateSymbol(void *, short, Hunk *, long, long);
  18. Prototype void    SetSymbol(Sym *, Hunk *, long, long);
  19.  
  20. static Sym *SymHash[HSIZE];
  21.  
  22.  
  23. #ifdef NO_ASM
  24.  
  25. int
  26. hash(char *name, short len)
  27. {
  28.     long hv = 0x1234FCB4;
  29.  
  30.     while (len) {
  31.     hv = (hv >> 23) ^ (hv << 5) ^ *name;
  32.     ++name;
  33.     --len;
  34.     }
  35.     return(hv & HMASK);
  36. }
  37.  
  38. #endif
  39.  
  40. Sym *
  41. FindSymbol(void *name, short len)
  42. {
  43.     Sym *sym;
  44.  
  45.     len <<= 2;
  46.     while (len && ((char *)name)[len-1] == 0)
  47.     --len;
  48.  
  49.     for (sym = SymHash[hash((char *)name, len)]; sym; sym = sym->HNext) {
  50.     if (sym->SymLen == len && strncmp((char *)name, sym->SymName, len) == 0) {
  51.         dbprintf(1, ("FindSym SUCC %.*s\n", len, name));
  52.         return(sym);
  53.     }
  54.     }
  55.     dbprintf(8, ("FindSym FAIL %.*s\n", len, name));
  56.     return(NULL);
  57. }
  58.  
  59. Sym *
  60. CreateSymbol(void *name, short len, Hunk *hunk, long value, long type)
  61. {
  62.     Sym *sym;
  63.     Sym **ps;
  64.  
  65.     len <<= 2;
  66.     while (len && ((char *)name)[len-1] == 0)
  67.     --len;
  68.  
  69.     ++MemNumSyms;
  70.     sym = zalloc(sizeof(Sym));
  71.     ps = SymHash + hash((char *)name, len);
  72.     sym->HNext = *ps;
  73.     sym->SymName = (char *)name;
  74.     sym->SymLen = len;
  75.     sym->Hunk = hunk;
  76.     sym->Value = value;
  77.     sym->Type = type;
  78.     *ps = sym;
  79.  
  80.     if (hunk /*&& SymOpt*/) {
  81.     AddTail(&hunk->SymList, (Node *)&sym->Node);
  82.     sym->Flags |= SYMF_SYMLIST;
  83.     }
  84.  
  85.     dbprintf(1, ("CreSym type %-3d value %-3d %.*s\n", sym->Type, sym->Value, sym->SymLen, sym->SymName));
  86.     return(sym);
  87. }
  88.  
  89. void
  90. SetSymbol(Sym *sym, Hunk *hunk, long value, long type)
  91. {
  92.     sym->Hunk = hunk;
  93.     sym->Value = value;
  94.     sym->Type = type;
  95.  
  96.     if (sym->Flags & SYMF_SYMLIST) {
  97.     Remove((Node *)&sym->Node);
  98.     sym->Flags &= ~SYMF_SYMLIST;
  99.     }
  100.     if (hunk /* && SymOpt*/) {
  101.     sym->Flags |= SYMF_SYMLIST;
  102.     AddTail(&hunk->SymList, (Node *)&sym->Node);
  103.     }
  104. }
  105.  
  106.